package services.movimiento;

import java.util.ArrayList;
import java.util.List;

import org.springframework.transaction.annotation.Transactional;

import util.assembly.MovimientoStockAssembly;
import bo.MovimientoStock;
import bo.PersistentObject;
import dao.MovimientoStockDAO;
import dto.MovimientoStockDTO;
import dto.SearchDTO;
import exceptions.CannotDeleteException;
import exceptions.CannotSaveException;

public class MovimientoStockService {
	
	MovimientoStockDAO movimientoStockDAO;
	
	/**
	 * Guarda un movimientoStock
	 * @param movimientoStockDTO	DTO de movimientoStock
	 */
	@Transactional
	public String save(MovimientoStockDTO movimientoStockDTO) throws CannotSaveException {
		
		MovimientoStock movimientoStock = MovimientoStockAssembly.toBO(movimientoStockDTO);
		
		String id = movimientoStockDAO.save(movimientoStock);
		if (id == null) {
			throw new CannotSaveException();
		}
		return id;
	}
	
	@Transactional
	public Object merge(MovimientoStockDTO movimientoStockDTO) throws CannotSaveException {
		
		MovimientoStock movimientoStock = MovimientoStockAssembly.toBO(movimientoStockDTO);
		
		Object e = movimientoStockDAO.merge(movimientoStock);
		if (e == null) {
			throw new CannotSaveException();
		}
		return e;
	}
	
	
	/**
	 * Borra un movimientoStock
	 * @param id	ID del movimientoStock a borrar
	 * @throws CannotDeleteException
	 */
	@Transactional
	public void delete(String id) throws CannotDeleteException {
		
		MovimientoStock movimientoStock = movimientoStockDAO.findById(id);
		
		movimientoStockDAO.delete(movimientoStock);
	}
	
	
	@Transactional
	public List<MovimientoStockDTO> search(SearchDTO searchDTO) {
		
		List<MovimientoStockDTO> lista = new ArrayList<MovimientoStockDTO>();
		
		List<PersistentObject> movimientoStocks = movimientoStockDAO.search(MovimientoStock.class, searchDTO);
		for (PersistentObject persistentObject : movimientoStocks) {
			lista.add(MovimientoStockAssembly.toDTO((MovimientoStock)persistentObject));
		}
		return lista;
	}
	
	
	
	/**
	 * Obtiene todos los producots
	 * @return	la lista de movimientoStocks
	 */
	@Transactional
	public List<MovimientoStockDTO> findAll() {
		
		List<MovimientoStockDTO> lista = new ArrayList<MovimientoStockDTO>();
		
		List<PersistentObject> movimientoStocks = movimientoStockDAO.findAll();
		for (PersistentObject persistentObject : movimientoStocks) {
			lista.add(MovimientoStockAssembly.toDTO((MovimientoStock)persistentObject));
		}
		return lista;
	}
	
	
	@Transactional
	public List<MovimientoStockDTO> findAll(String order, boolean asc) {
		
		List<MovimientoStockDTO> lista = new ArrayList<MovimientoStockDTO>();
		
		List<PersistentObject> movimientoStocks = movimientoStockDAO.findAll(MovimientoStock.class, order, asc);
		for (PersistentObject persistentObject : movimientoStocks) {
			lista.add(MovimientoStockAssembly.toDTO((MovimientoStock)persistentObject));
		}
		return lista;
	}
	
	
	/**
	 * Obtiene un movimientoStock segun ID
	 * @param id	el ID
	 * @return el movimientoStock
	 */
	@Transactional
	public MovimientoStockDTO findById(String id) {
		
		MovimientoStock movimientoStock = movimientoStockDAO.findById(id);
		MovimientoStockDTO movimientoStockDTO = MovimientoStockAssembly.toDTO(movimientoStock);
		return movimientoStockDTO;
	}
	

	public MovimientoStockDAO getMovimientoStockDAO() {
		return movimientoStockDAO;
	}

	public void setMovimientoStockDAO(MovimientoStockDAO movimientoStockDAO) {
		this.movimientoStockDAO = movimientoStockDAO;
	}
	
}
